gpg 加密操作流程
GPG(GNU Privacy Guard) 是一个加密、签名通信内容以及解密的内容的软件,采用的加密方式是非对称加密(即加密和解密使用的密钥不相同,例如使用公钥和私钥)[^1]。它的诞生是因为作为商业软件的 PGP ,不能自由使用,因此 FSF 开发的 GNU 版本。本篇笔记是为了阐释 git
在使用签署过程中,演示加密操作。
1. 安装
在 Mac 下安装 GnuPG 可以直接使用 homebrew
工具进行安装,直接使用命令:
1 | $ brew install gpg |
2. 密钥生成
gpg 采用非对称加密,因此在进行加密和解密操作之前需要有相应的私钥和公钥,而生成相应的密钥的命令:
1 | # 因 gpg 版本不同,生成密钥过程的命令存在一些差异 |
以上是 GitHub 文档建议的密钥生成方式,但是可以直接使用 gpg --gen-key
来生成(但生成密钥的流程操作顺序可能不一致,但完整的流程过程是一致的)。输入 gpg --full-generate-key
之后会进行如下流程
选择加密算法选项:
gpg (GnuPG) 2.2.22; Copyright (C) 2020 Free Software Foundation, Inc.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.Please select what kind of key you want:
(1) RSA and RSA (default)
(2) DSA and Elgamal
(3) DSA (sign only)
(4) RSA (sign only)
(14) Existing key from card
Your selection?推荐使用 RSA 算法,即使用默认选项或者第四个 RSA 签名选项
设置密钥长度:
RSA keys may be between 1024 and 4096 bits long.
What keysize do you want? (3072)一般情况下是长度越高,密码越安全
设置有效期
Please specify how long the key should be valid.
0 = key does not expire <n> = key expires in n days <n>w = key expires in n weeks <n>m = key expires in n months <n>y = key expires in n years
Key is valid for? (0)
设置密钥有效期,默认选项为 0 表示永久有效,后面非别表示对应的多少天、周、月以及年的有效期。
在完成确认之后需要补充个人信息,包括姓名、邮箱地址以及备注信息。填充信息之后,会再次要求输入 passphrase 以保护私钥。
3. 密钥管理
3.1 密钥导出
生成的密钥是一个二进制文件,需要使用公钥和私钥对应的 ASCII 数值需要进行转换,之后才能上传到相应的服务器上(例如 GitHub 上)。
3.1.1 公钥导出
使用命令 gpg --armor --output <filename> --export <uid>
可以将对应 uid
的私钥导出到指定的 filename 文件中
对于导出的公钥可以直接复制应用于 GitHub 中,和 SSH 生成的公钥应用方法类似。
3.1.2 私钥导出
使用命令 gpg --armor --output <filename> --export-secret-keys <uid>
可以将将私钥导出,私钥导出需要密码
问题
1. gpg 签名失败
在使用 git tag -s <tag_name>
报错:
error: gpg failed to sign the data
error: unable to sign the tag
The tag message has been left in .git/TAG_EDITMSG
因为环境变量中没有设置 GPG_TTY
,在 bash_profile
中添加上 export GPG_TTY=$(tty)
即可
参考
[^1]: GnuPG - 维基百科,自由的百科全书
[^2]: GPG入门教程 - 阮一峰的网络日志